function [f_min,x]=linesearch_optim(f,lb,ub)
%% 参数初始化
% lb=[-1e2,-1e2];ub=[1e2,1e2];%变量范围
n=length(lb);% 变量个数
alpha0m=1/n*mean(ub-lb);% 初始步长
rand1=rand();
x0=rand1*ub+(1-rand1)*lb;% 迭代初始点
% f=@(x)(x(1)-1)^2+(x(2)-2)^2;% 目标函数
%% 线搜索计算过程
alpha0=alpha0m;% 初始步长
mn=300;% 迭代次数
gama2=1/mn;% 迭代次数倒数
mn1=100;% 线搜索准则判断迭代次数
x=x0;% 初始点位置
dx=(1e-6)*(ub-lb);% 求梯度时维度微元设置
gama1=0.9;% 回退法参数gama1设置
c1=1e-2;% 常数c1设置
for i=1:mn
    alpha0=(mn-i+1)*gama2*alpha0m;% 该次迭代初始步长
    tic
    alpha=alpha0;
    c_u=zeros(1,n);% 该点梯度初始化
    for bianliang=1:n% 求梯度
        c_un1=x(bianliang)-dx(bianliang);
        c_un2=x(bianliang)+dx(bianliang);
        if x(bianliang)-dx(bianliang)<lb(bianliang)% 当要计算的梯度值小于变
            % 量下限时处理
            r_un=rand();
            c_un1=r_un*lb(bianliang)+(1-r_un)*x(bianliang);
        elseif x(bianliang)+dx(bianliang)>ub(bianliang)% 当要计算的梯度值大
            % 于变量下限时处理
            r_un=rand();
            c_un2=r_un*ub(bianliang)+(1-r_un)*x(bianliang);
        end
        x1=x;x2=x;
        x1(bianliang)=c_un1;x2(bianliang)=c_un2;
        c_u(bianliang)=(f(x2)-f(x1))/(2*dx(bianliang));
    end
    c_u=c_u/norm(c_u);% 确定该点最终梯度方向，当计算中未出现超过变量限制时为
    % 梯度方向，否则为次梯度方向。
    for j=1:mn1
        xk=x+(-c_u*alpha);% 迭代点
        for bianliang=1:n% 该步限制迭代之后的点位于自变量范围之内
            if xk(bianliang)<lb(bianliang)
                 r_un=rand();
                 xk(bianliang)=r_un*lb(bianliang)+(1-r_un)*x(bianliang);
            elseif xk(bianliang)>ub(bianliang)
                 r_un=rand();
                 xk(bianliang)=r_un*ub(bianliang)+(1-r_un)*x(bianliang);
            end
        end
        % 该步添加线搜索准则
        if f(xk)<=f(x)-c1*alpha*(c_u*c_u')% Armijo准则
            break
        else
            alpha=gama1*alpha;
        end
    end
    x=xk;
    toc
end
f_min=f(x);